import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class GradeManagementSystem {
    // 使用静态列表存储学生记录（全局数据）
    private static final List<StudentRecord> records = new ArrayList<>();
    // 使用静态Scanner对象处理控制台输入
    private static final Scanner scanner = new Scanner(System.in);

    // 主函数：启动系统菜单
    public static void main(String[] args) {
        while (true) {
            displayMenu(); // 显示主菜单
            int choice = getIntInput("请输入选项序号："); // 获取用户选择
            switch (choice) {
                case 1:
                    addRecord(); // 记录成绩
                    break;
                case 2:
                    queryRecord(); // 查询成绩
                    break;
                case 3:
                    calculateStats(); // 统计成绩
                    break;
                case 4:
                    System.out.println("感谢使用，再见！");
                    scanner.close(); // 关闭输入流
                    return;
                default:
                    System.out.println("无效选项，请重新输入。");
            }
        }
    }

    // 显示系统菜单
    private static void displayMenu() {
        System.out.println("\n===== 欢迎使用学生成绩管理系统 ======");
        System.out.println("1. 记录学生成绩");
        System.out.println("2. 查询学生成绩");
        System.out.println("3. 统计课程成绩");
        System.out.println("4. 退出系统");
    }

    // 记录学生成绩（含数据验证）
    private static void addRecord() {
        System.out.println("\n===== 记录学生成绩 ======");
        // 输入姓名（非空验证）
        System.out.print("请输入学生姓名：");
        String name = scanner.nextLine().trim();
        if (name.isEmpty()) {
            System.out.println("错误：姓名不能为空！");
            return;
        }
        // 输入学号（唯一验证）
        System.out.print("请输入学生学号：");
        String id = scanner.nextLine().trim();
        if (records.stream().anyMatch(r -> r.id.equals(id))) {
            System.out.println("错误：该学号已存在！");
            return;
        }
        // 输入课程名称（非空验证）
        System.out.print("请输入课程名称：");
        String course = scanner.nextLine().trim();
        if (course.isEmpty()) {
            System.out.println("错误：课程名称不能为空！");
            return;
        }
        // 输入成绩（范围验证：0-100）
        int score = getIntInput("请输入成绩（0-100）：");
        if (score < 0 || score > 100) {
            System.out.println("错误：成绩必须在0-100之间！");
            return;
        }
        // 创建学生记录并添加到列表
        records.add(new StudentRecord(name, id, course, score));
        System.out.println("成绩已成功记录！");
    }

    // 查询学生成绩（支持姓名、学号、课程查询）
    private static void queryRecord() {
        System.out.println("\n===== 查询学生成绩 ======");
        System.out.println("1. 按学生姓名查询");
        System.out.println("2. 按学生学号查询");
        System.out.println("3. 按课程名称查询");
        int type = getIntInput("请输入选项序号：");
        if (type < 1 || type > 3) {
            System.out.println("错误：无效查询类型！");
            return;
        }
        System.out.print("请输入查询值：");
        String value = scanner.nextLine().trim();
        boolean found = false;
        // 遍历记录并匹配查询条件
        for (StudentRecord r : records) {
            if ((type == 1 && r.name.equals(value)) ||
                    (type == 2 && r.id.equals(value)) ||
                    (type == 3 && r.course.equals(value))) {
                System.out.printf("姓名：%s，学号：%s，课程：%s，成绩：%d%n",
                        r.name, r.id, r.course, r.score);
                found = true;
            }
        }
        if (!found) {
            System.out.println("未找到匹配的记录！");
        }
    }

    // 统计课程成绩（平均分、最高分、最低分）
    private static void calculateStats() {
        System.out.println("\n===== 统计课程成绩 ======");
        System.out.print("请输入课程名称：");
        String course = scanner.nextLine().trim();
        List<Integer> scores = new ArrayList<>();
        // 收集指定课程的所有成绩
        for (StudentRecord r : records) {
            if (r.course.equals(course)) {
                scores.add(r.score);
            }
        }
        if (scores.isEmpty()) {
            System.out.println("错误：未找到该课程的成绩记录！");
            return;
        }
        // 计算总分、平均分、最高分、最低分
        int sum = 0;
        double max = scores.get(0);
        double min = scores.get(0);
        for (int score : scores) {
            sum += score;
            max = Math.max(max, score);
            min = Math.min(min, score);
        }
        double average = (double) sum / scores.size();
        // 输出结果（保留两位小数）
        System.out.printf("课程：%s%n", course);
        System.out.printf("平均分：%.2f%n", average);
        System.out.printf("最高分：%.0f%n", max);
        System.out.printf("最低分：%.0f%n", min);
    }

    // 通用整数输入方法（含格式验证）
    private static int getIntInput(String prompt) {
        while (true) {
            System.out.print(prompt);
            try {
                return Integer.parseInt(scanner.nextLine());
            } catch (NumberFormatException e) {
                System.out.println("错误：请输入有效的整数！");
            }
        }
    }
}